# 10.dict 字典数据类型

# 字典类型(dict)

字典是Python唯一的一个映射类型,字典的意义:就是为了可以快速的查找或定位数据

格式:{ } 使用花(大)括号 括起来的键值对(key:value) 保存数据

在字典中,key是唯一的,在保存的时候,会根据key来计算出一个内存地址,然后将key_value保存在这个地址中,这种算法被称为:hash算法(哈希算法)

在字典中,字典存储的 key:value 中的 key必须要可hash / 哈希,就是不可变的,而value不限制

可哈希(不可变)的数据类型:整形类型(int),布尔类型(bool),字符串类型(str),元组类型(tuple)

不可哈希(可变)的数据类型:列表类型(list),字典类型(dict),集合类型(set)

so = {1:"周杰伦","2":"林俊杰",(3,):"周芷若",False:"周润发"}
print(so)

执行结果:
{1: '周杰伦', '2': '林俊杰', (3,): '周芷若', False: '周润发'}

​ 运用了,整形,字符串,布尔,元组来作为字典的key值

# 字典的的增删改查

# 增加

# 增加(存在就替代)

向字典中增加数据

如果字典中,有相同的key字段,会直接修改为最新赋值的内容

格式:字典变量[key值] = "value值"

so = {}
so["昆凌"] = "周杰伦的老婆"
print(so)

执行结果:
{'昆凌': '周杰伦的老婆'}

# 增加(存在不保存) - setdefault()

向字典中增加数据

如果字典中,有相同的key字段,默认不保存

格式:字典变量.setdefault(key值, value值)

so = {}
so["昆凌"] = "周杰伦的老婆"
so.setdefault("杨紫","张一山的女朋友")
so.setdefault("杨紫","是张一山的女朋友???")
print(so)

执行结果:
{'昆凌': '周杰伦的老婆', '杨紫': '张一山的女朋友'}
# 获取 setdefault()的返回值

在添加的时候,无论是否添加成功, setdefault()都会返回一个添加的key对应的value值

so = {"杨紫":"不想当张一山的女朋友"}
so["昆凌"] = "周杰伦的老婆"
soo = so.setdefault("杨紫","张一山的女朋友")
print("增加后的返回值:",soo)
print(so)

执行结果:
增加后的返回值: 不想当张一山的女朋友
{'杨紫': '不想当张一山的女朋友', '昆凌': '周杰伦的老婆'}

​ 以上实例,无论增加是否成功都会返回key对应的值,简单来说,就是他执行是分成二部分,先增加,在查询

# 删除

# 按key值删除 - pop()

通过指定的key值删除指定的内容,如果不填key值,程序会报错

格式:字典变量.pop(key值)

so = {'昆凌': '周杰伦的老婆', '杨紫': '张一山的女朋友'}
so.pop("昆凌")
print(so)

执行结果:
{'杨紫': '张一山的女朋友'}
# 获取删除的value值 - pop()

格式:变量 = 字典变量.pop(key值)

so = {'昆凌': '周杰伦的老婆', '杨紫': '张一山的女朋友'}
soo = so.pop("昆凌")
print("删除的值:",soo)
print(so)

执行结果:
删除的值: 周杰伦的老婆
{'杨紫': '张一山的女朋友'}

# 随机删除 - popitem()

随机删除字典的一个数据,删除那个不固定,看系统心情

格式:字典变量.popitem()

so = {'昆凌': '我是周杰伦的老婆', '杨紫': '我是张一山的女朋友',"张一山":"想让杨紫当我老婆","周杰伦":"我要看好我老婆"}
so.popitem()
print(so)

执行结果:
{'昆凌': '周杰伦的老婆', '杨紫': '张一山的女朋友', '张一山': '想让杨紫当我老婆'}
# 获取删除的值 - popitem()

需要注意:获取后的返回值是元组类型

格式:变量 = 字典变量.popitem()

so = {'昆凌': '周杰伦的老婆', '杨紫': '张一山的女朋友',"张一山":"想让杨紫当我老婆","周杰伦":"我要看好我老婆"}
soo = so.popitem()
print("删除的值:",soo)
print(so)

执行结果:
删除的值: ('周杰伦', '我要看好我老婆')
{'昆凌': '周杰伦的老婆', '杨紫': '张一山的女朋友', '张一山': '想让杨紫当我老婆'}

# 清空字典 - clear()

清空字典内的所有数据

格式:字典变量.clear()

so = {'昆凌': '周杰伦的老婆', '杨紫': '张一山的女朋友',"张一山":"想让杨紫当我老婆","周杰伦":"我要看好我老婆"}
so.clear()
print(so)

执行结果:
{}

# 全局删除-del

能删单一的值,也可以删除字典本身

格式:del 字典变量[key值]

so = {'昆凌': '周杰伦的老婆', '杨紫': '张一山的女朋友',"张一山":"想让杨紫当我老婆","周杰伦":"我要看好我老婆"}
del so["周杰伦"]
print(so)

执行结果:
{'昆凌': '周杰伦的老婆', '杨紫': '张一山的女朋友', '张一山': '想让杨紫当我老婆'}

​ 以上实例,指定key值删除

so = {'昆凌': '周杰伦的老婆', '杨紫': '张一山的女朋友',"张一山":"想让杨紫当我老婆","周杰伦":"我要看好我老婆"}
del so
print(so)

执行结果:
NameError: name 'so' is not defined
意思:没有定义名称“so”

​ 以上实例,如果想要删除字典本身,可以使用这个方法

# 修改

# 常用修改

修改字典中的数据

格式:字典变量[key值] = "value值"

so = {'昆凌': '周杰伦的老婆', '杨紫': '张一山的女朋友',"张一山":"想让杨紫当我老婆","周杰伦":"我要看好我老婆"}
so["张一山"] = "我不想让杨紫当我老婆了"
print(so
      
执行结果:
{'昆凌': '周杰伦的老婆', '杨紫': '张一山的女朋友', '张一山': '我不想让杨紫当我老婆了', '周杰伦': '我要看好我老婆'}

​ 以上实例,注意,如果修改的key值不存在,默认会创建一个新的内容

# 实例:模拟银行扣费

使用元组类型,来模拟银行扣费

so = {"name":"江凡","bank":"建设银行","money":10000}
while 1:
    print("=" * 30)
    print("姓名:",so["name"])
    print("所属银行:",so["bank"])
    print("当前金额:",so["money"])
    print("=" * 30)
    mone = input("请输入要取出的额度,最低:100 退出请按 Q :")
    if mone.upper() == "Q":
        print("退出,欢迎下次光临")
        break
    elif mone.isdigit() == False:
        print("请输入金额数字或输入Q退出")
        continue
    elif int(mone) <= so["money"]:
        so["money"] = so["money"] - int(mone)
    else:
        print("输入的金额,大于存储的金额,请重新输入")

# 将别字典更新到字典中-update()

将另一个字典的内容更新到当前字典中

格式:字典变量.update(别一个字典变量)

so = {'昆凌': '周杰伦的老婆',"周杰伦":"我要看好我老婆"}
so1 = {'杨紫': '张一山的女朋友',"张一山":"想让杨紫当我老婆"}
so.update(so1)
print(so)

执行结果:
{'昆凌': '周杰伦的老婆', '周杰伦': '我要看好我老婆', '杨紫': '张一山的女朋友', '张一山': '想让杨紫当我老婆'}

​ 以上实例,将so1中的内容全部更新的so中

# 查询

# 查询(如果不存在报错)

按key值查询对应的value值,如果key不存在,程序报错

格式:字典变量[key值]

so = {1:"董事部",2:"财务部",3:"业务部",4:"人力行政部",5:"技术部"}
print(so[2])

执行结果:
财务部

# 查询(如果不存在返回值) -get()

也是按key值来查询对应的value值,不过如果key不存在,默认会输出"None",也可以自己定义

二种格式:

  1. 变量.get(key值)

    so = {1:"董事部",2:"财务部",3:"业务部",4:"人力行政部",5:"技术部"}
    print(so.get(3))
    
    执行结果:
    业务部
    
  2. 变量 = 变量.get(key值,返回值)

    so = {1:"董事部",2:"财务部",3:"业务部",4:"人力行政部",5:"技术部"}
    soo = so.get(10)
    print(soo)
    
    执行结果:
    None
    

    ​ 以上的实例,输入的key不存在,默认返回None

    so = {1:"董事部",2:"财务部",3:"业务部",4:"人力行政部",5:"技术部"}
    soo = so.get(10,"key值不存在")
    print(soo)
    
    执行结果:
    key值不存在
    

    ​ 以上的实例,输入的key不存在,但我们定义了返回值为 key值不存在 , 就会返回并输出

# 多字典键 - fromkey()

fromkeys() 函数用于创建一个新字典,以key中元素做字典的键,value为字典所有键对应的初始值。

格式:变量 = dict.fromkeys(key,value)

so = dict.fromkeys(["明星","歌手"],["周杰伦","周树人","周星星"])
print(so)

执行结果:
{'明星': ['周杰伦', '周树人', '周星星'], '歌手': ['周杰伦', '周树人', '周星星']}

​ 列表中的每⼀项都会作为key, 后面列表中的内容作为value. 生成dict

so = dict.fromkeys(["明星","歌手"],["周杰伦","周树人","周星星"])
print(so)
so["明星"].append("江凡")
print(so)

执行结果:
{'明星': ['周杰伦', '周树人', '周星星'], '歌手': ['周杰伦', '周树人', '周星星']}
{'明星': ['周杰伦', '周树人', '周星星', '江凡'], '歌手': ['周杰伦', '周树人', '周星星', '江凡']}

​ 增加值的时候只增加了明星这个key值,那为什么另一个key值也会跟着增加,因为以上两个Key值是同用一个列 表,所以改了一个,另一个也会跟着改

还有其它用法,如需自行百度

#

# 字典的for循环操作

在for循环中使用字典迭代,出来的数据是字典的key值

so = {1: "董事部", 2: "财务部", 3: "业务部", 4: "人力行政部", 5: "技术部"}
for i in so:
    print(so[i])
    
执行结果:
董事部
财务部
业务部
人力行政部
技术部

​ 以上实例,因知道了for循环出来的是字典的key值,那直接拿key值来获取value值

# 实例:for循环删除

要求:删除所有带技术部的值,{1: "董事部", 2: "财务部", 3: "业务部", 4: "人力行政部", 5: "技术部",6: "技术部"}

so = {1: "董事部", 2: "财务部", 3: "业务部", 4: "人力行政部", 5: "技术部",6: "技术部"}
wo = []
for i in so:
    if so[i] == "技术部":
        wo.append(i)
for i in wo:
    del so[i]
print(so)

执行结果:
{1: '董事部', 2: '财务部', 3: '业务部', 4: '人力行政部'}

# 字典常用操作

# 获取字典中所有的key值 - keys()

可以查询字典中的所有key值

注意:keys()的返回结果很像列表或元组,但不是列表跟元组

也可以通过for循环进行迭代循环查询

格式:字典变量.keys()

so = {1: "董事部", 2: "财务部", 3: "业务部", 4: "人力行政部", 5: "技术部"}
print(so.keys())

执行结果:
dict_keys([1, 2, 3, 4, 5])

​ 以上实例,返回所有key值,返回值很像列表或元组,但是不是列表或元组类型

so = {1: "董事部", 2: "财务部", 3: "业务部", 4: "人力行政部", 5: "技术部"}
for i in so.keys():
    print(i)

执行结果:
1
2
3
4
5

​ 以上实例,可以通过for循环来迭代循环查询所有的key值

# 获取字典中所有的value值 - values()

可以查询获取字典中的所有value值

注意:values()的返回结果很像列表或元组,但不是列表跟元组

也可以通过for循环进行迭代循环查询

格式:字典变量.values()

so = {1: "董事部", 2: "财务部", 3: "业务部", 4: "人力行政部", 5: "技术部"}
print(so.values())

执行结果:
dict_values(['董事部', '财务部', '业务部', '人力行政部', '技术部'])

​ 以上实例,返回所有value值,返回值很像列表或元组,但是不是列表或元组类型

so = {1: "董事部", 2: "财务部", 3: "业务部", 4: "人力行政部", 5: "技术部"}
for i in so.values():
    print(i)
    
执行结果:
董事部
财务部
业务部
人力行政部
技术部

​ 以上实例,可以通过for循环来迭代循环查询所有的value值

# 获取字典中的key跟value值 - itmes()

可以查询获取字典中的所有key值跟value值,返回的内存key跟value是由元组组成

注意:itmes()的返回结果很像列表或元组,但不是列表跟元组

也可以通过for循环进行迭代循环查询

格式:字典变量.itmes()

so = {1: "董事部", 2: "财务部", 3: "业务部", 4: "人力行政部", 5: "技术部"}
print(so.items())

执行结果:
dict_items([(1, '董事部'), (2, '财务部'), (3, '业务部'), (4, '人力行政部'), (5, '技术部')])

​ 以上实例,返回所有key值跟value值,返回值很像列表或元组,但是不是列表或元组类型

so = {1: "董事部", 2: "财务部", 3: "业务部", 4: "人力行政部", 5: "技术部"}
for i in so.items():
    print(i)
    
执行结果:
(1, '董事部')
(2, '财务部')
(3, '业务部')
(4, '人力行政部')
(5, '技术部')

​ 以上实例,可以通过for循环来迭代循环查询所有的key值跟value值

so = {1: "董事部", 2: "财务部", 3: "业务部", 4: "人力行政部", 5: "技术部"}
for i in so.items():
    print(i[0])
    
执行结果:
1
2
3
4
5

​ 以上实例,可以通过for循环来迭代循环查询所有的key值

so = {1: "董事部", 2: "财务部", 3: "业务部", 4: "人力行政部", 5: "技术部"}
for i in so.items():
    print(i[1])
    
执行结果:
董事部
财务部
业务部
人力行政部
技术部

​ 以上实例,可以通过for循环来迭代循环查询所有的value值

# 字典的嵌套

so = {'name': '江凡', 'age': '22', 'wife': {'name': '小燕子', 'age': '21'}, 'childern': [{'name': '小笨蛋', 'age': 3, 'sex': '男'}, {'name': '小宝贝', 'age': 1, 'sex': '女'}], 'parent': {'father': {'name': '江太爷', 'age': 61}, 'mother': {'name': '陈太婆', 'age': 58}}}

========
======
========

so = {
    "name":"江凡",
    "age":"22",
    "wife":{
        "name":"小燕子",
        "age":"21"
    },
    "childern":[
        {
            "name":"小笨蛋",
             "age":3,
            "sex":"男"
         },
        {
            "name":"小宝贝",
            "age":1,
            "sex":"女"
         }
    ],
    "parent":{
        "father":{
            "name":"江太爷",
            "age":61,
        },
        "mother":{
            "name":"陈太婆",
            "age":58
        }
    }
}

# 查询江凡他女儿的姓名

print(so["childern"][1]["name"])print(so.get("childern")[1].get("name"))

执行结果:
小宝贝

# 查询江凡他父亲的姓名

print(so["parent"]["father"]["name"])print(so.get("parent").get("father").get("name"))

执行结果:
江太爷

# 查询江凡他老婆的姓名

print(so["wife"]["name"])print(so.get("wife").get("name"))

执行结果:
小燕子

# 练习

题目

so = {'name':['alex',2,3,5],'job':'teacher','oldboy':{'alex':['python1','python2',100]}}

在name对应的列表追加一个元素’wusir’

so = {'name':['alex',2,3,5],'job':'teacher','oldboy':{'alex':['python1','python2',100]}}
so["name"].append("wusir")
print(so)

执行结果:
{'name': ['alex', 2, 3, 5, 'wusir'], 'job': 'teacher', 'oldboy': {'alex': ['python1', 'python2', 100]}}

在name对应的列表中的alex首字母大写

so = {'name':['alex',2,3,5],'job':'teacher','oldboy':{'alex':['python1','python2',100]}}
so["name"][0] = so["name"][0].capitalize()
print(so)

执行结果:
{'name': ['Alex', 2, 3, 5], 'job': 'teacher', 'oldboy': {'alex': ['python1', 'python2', 100]}}

oldboy对应的字典加一个键值对’少年’,’江凡’

so = {'name':['alex',2,3,5],'job':'teacher','oldboy':{'alex':['python1','python2',100]}}
so["oldboy"]["少年"] = "江凡"
print(so)

执行结果:
{'name': ['alex', 2, 3, 5], 'job': 'teacher', 'oldboy': {'alex': ['python1', 'python2', 100], '少年': '江凡'}}

将oldboy对应的字典中的alex对应的列表中的python2删除

so = {'name':['alex',2,3,5],'job':'teacher','oldboy':{'alex':['python1','python2',100]}}
so["oldboy"]["alex"].pop(1)
print(so)

执行结果:
{'name': ['alex', 2, 3, 5], 'job': 'teacher', 'oldboy': {'alex': ['python1', 100]}}